﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SeguroSoft.Models;

namespace SeguroSoft.Controllers
{
    public class RevisionTecnicaController : Controller
    {
        //
        // GET: /RevisionTecnica/

        //Se Instancia el repositorio
        private static List<RevisionTecnica> revisionesActuales = new List<RevisionTecnica>();
        RepositorioRevisionTecnica rt = new RepositorioRevisionTecnica();

        public ActionResult Index()
        {
            List<string> comunas = rt.ListarComunas(); comunas.Sort();
            List<string> compañias = rt.ListarCompañias(); compañias.Sort();
            List<string> tiempoEspera = ListarTiempoEspera();
            List<string> costo = ListarCostos();
            List<List<string>> parametros = new List<List<string>> { comunas, compañias, tiempoEspera, costo };

            return View("IndexRT", parametros);
        }

        public List<string> ListarTiempoEspera()
        {
            List<RevisionTecnica> revisiones = rt.EncontrarTodasLasRevisiones().ToList();
            List<string> resultados = new List<string>();
            int max = 0;
            foreach (RevisionTecnica r in revisiones)
            {
                if (int.Parse(r.TiempoEspera.ToString()) > max)
                    max = int.Parse(r.TiempoEspera.ToString());
            }

            int ultimo = 0;
            for (int i = 0; i < 6; i++)
            {
                ultimo += (max / 6);
                resultados.Add(ultimo.ToString());
            }

            return resultados;

        }

        public ActionResult BusquedaAvanzada()
        {

            string direccion = Request.Form["direccion"];
            string comuna = Request.Form["comuna"];
            string compañia = Request.Form["compañia"];
            string tiempoEsp = Request.Form["tiempo espera"];
            int mayorIgualTiempo = int.Parse(Request.Form["mayor igual tiempo"]);
            string costo = Request.Form["costo"];
            int mayorIgualCosto = int.Parse(Request.Form["mayor igual costo"]);
            string tipo = Request.Form["tipo revision"];
          
            revisionesActuales=FiltrarResultados(direccion, comuna, compañia, tiempoEsp, mayorIgualTiempo, costo, mayorIgualCosto,tipo);
            

            if (revisionesActuales.Count == 0)
                return View("Not Found");
            else
                return View("Busqueda", AgregarCompañiaARevision(revisionesActuales));

        }

        public ActionResult BusquedaFiltrada()
        {
            string tiempo = Request.Form["TiempoEspera"];
            string costo = Request.Form["Costo"];
            string tipoRevision = Request.Form["TipoRevision"];
            List<RevisionTecnica> resultadosFiltrados = Filtrar2(costo,tiempo,tipoRevision);

            if (resultadosFiltrados.Count == 0)
                return View("Not Found");
            else
                return View("Busqueda", AgregarCompañiaARevision(resultadosFiltrados));
        }

        public ActionResult VolverABusqueda()
        {
            if (revisionesActuales.Count == 0)
                return Index();
            else
                return View("Busqueda", AgregarCompañiaARevision(revisionesActuales));
        }

        public ActionResult ComparacionInvalida()
        {
            return View("Not Found");
        }



        public ActionResult Busqueda(string parametro)
        {

            List<RevisionTecnica> resultados = rt.EncontrarPorParametroGeneral(parametro).ToList();
            revisionesActuales = resultados;
            if (resultados.Count == 0)
            {
                List<string> aux = new List<string>();
                aux.Add(parametro);
                return View("Not Found", aux);
            }
            else
                return View("Busqueda", AgregarCompañiaARevision(resultados));
        }

        public List<RevisionTecnica> Filtrar2(string costo, string tiempoEspera, string tipo)
        {
            List<RevisionTecnica> resultado = new List<RevisionTecnica>();
            if (revisionesActuales.Count != 0)
            {
                foreach (RevisionTecnica r in revisionesActuales)
                {
                    if (int.Parse(r.Costo) >= int.Parse(costo) && int.Parse(costo) != 0)
                        resultado.Add(r);
                    else if (int.Parse(r.TiempoEspera) >= int.Parse(tiempoEspera) && int.Parse(tiempoEspera) != 0)
                        resultado.Add(r);
                    else if (r.TipoRevision.Equals(tipo))
                        resultado.Add(r);

                }
            }
            return resultado;
        }

        public List<RevisionTecnica> FiltrarResultados(string direccion, string comuna, string compañia, string tiempoEsp, int mayorIgual, string costo, int costoMayorIgual, string tipo)
        {
            List<RevisionTecnica> resultados;
            List<RevisionTecnica> resultados2;

            if (!comuna.Equals("N/A"))
            {
                resultados = rt.EncontrarRevisionPorComuna(comuna).ToList();
                resultados2 = rt.EncontrarRevisionPorComuna(comuna).ToList();
            }
            else
            {
                resultados = rt.EncontrarTodasLasRevisiones().ToList(); resultados2 = rt.EncontrarTodasLasRevisiones().ToList();
            }

            if (resultados == null)
                return null;

            //filtrado por direccion

            if(!tipo.Equals("N/A"))
            {
                foreach(RevisionTecnica r in resultados)
                {
                    if(!r.TipoRevision.Contains(tipo))
                        resultados2.Remove(r);
                }
            }
            if (!direccion.Equals(""))
            {
                foreach (RevisionTecnica r in resultados)
                {
                    if (!r.Calle.ToLower().Contains(direccion.ToLower()))
                    {
                        resultados2.Remove(r);
                    }
                }
            }

            if (!compañia.Equals("N/A"))
            {
                foreach (RevisionTecnica r in resultados)
                {
                    if (!rt.getNombreCompañia(r.IDCompañia).ToLower().Contains(compañia.ToLower()))
                        resultados2.Remove(r);
                }
            }

            if (!tiempoEsp.Equals("N/A"))
            {
                foreach (RevisionTecnica r in resultados)
                {
                    if (mayorIgual == 1)
                    {
                        if (!(int.Parse(tiempoEsp) <= int.Parse(r.TiempoEspera)))
                            resultados2.Remove(r);
                    }

                    else if (mayorIgual == 2)
                    {
                        if (!(int.Parse(tiempoEsp) >= int.Parse(r.TiempoEspera)))
                            resultados2.Remove(r);
                    }

                    else
                    {
                        if (!(int.Parse(tiempoEsp) == int.Parse(r.TiempoEspera)))
                            resultados2.Remove(r);
                    }

                }

            }

            if (!costo.Equals("N/A"))
            {
                foreach (RevisionTecnica r in resultados)
                {
                    if (costoMayorIgual == 1)
                    {
                        if (!(int.Parse(costo) <= int.Parse(r.Costo)))
                            resultados2.Remove(r);
                    }

                    else if (costoMayorIgual == 2)
                    {
                        if (!(int.Parse(costo) >= int.Parse(r.Costo)))
                            resultados2.Remove(r);
                    }

                    else
                    {
                        if (!(int.Parse(costo) == int.Parse(r.Costo)))
                            resultados2.Remove(r);
                    }
                }
            }

            return resultados2;
        }




        public List<string> ListarCostos()
        {
            List<RevisionTecnica> revisiones = rt.EncontrarTodasLasRevisiones().ToList();
            List<string> resultados = new List<string>();
            int max = 0;
            foreach (RevisionTecnica r in revisiones)
            {
                if (int.Parse(r.Costo) > max)
                    max = int.Parse(r.Costo);
            }

            int ultimo = 0;
            for (int i = 0; i < 6; i++)
            {
                ultimo += (max / 6);
                resultados.Add(ultimo.ToString());
            }

            return resultados;

        }

        public Dictionary<RevisionTecnica, string> AgregarCompañiaARevision(List<RevisionTecnica> revisiones)
        {
            Dictionary<RevisionTecnica, string> resultado = new Dictionary<RevisionTecnica, string>();

            foreach (RevisionTecnica r in revisiones)
            {
                resultado.Add(r, rt.getNombreCompañia(r.IDCompañia));
            }

            return resultado;
        }

        public ActionResult Detalles(int id)
        {
            if (rt.EncontarRevisionPorId(id) != null)
            {
                List<RevisionTecnica> r = new List<RevisionTecnica> { rt.EncontarRevisionPorId(id) };
                return View("Detalles", AgregarCompañiaARevision(r));
            }
            else
                return View("Not Found");

        }

        public ActionResult Comparar()
        {
            List<string> ids = new List<string>();
            List<RevisionTecnica> resultados = new List<RevisionTecnica>();
            string checkBox = Request.Form["compararCheckBox"];

            if (checkBox == null)
            {
                return ComparacionInvalida();
            }
           
            ids = checkBox.Split(',').ToList();
            foreach (string id in ids)
            {
                resultados.Add(rt.EncontarRevisionPorId(int.Parse(id)));
            }

            CompararController c = new CompararController();

            if (resultados.Count < 2)
            {
               return ComparacionInvalida();
            }

            return c.CompararViewRevisionTecnica(resultados);
        }

        public ActionResult Comentar()
        {
            
            if (!this.User.Identity.IsAuthenticated)
            {
                return Index();
            }

            else
            {

                List<string> datosUsuario = new List<string> { this.User.Identity.Name, Request.Form["id"]};
                        return View("Comentar", datosUsuario);
            }

        }

        public ActionResult Guardar()
        {
            int id =  int.Parse(Request.Form["id"]);

            int ranking;
            Int32.TryParse(Request.Form["ranking"], out ranking);
            Comentario comentario = new Comentario();
            comentario.Fecha = DateTime.Now;
            comentario.Titulo = Request.Form["titulo"];
            comentario.Contenido = Request.Form["contenido"];
            comentario.RankingServicio = ranking;
            comentario.Usuario = this.User.Identity.Name;
            RepositorioComentario repositorioComentarios = new RepositorioComentario();
            repositorioComentarios.crearcomentario(comentario);

            TIRT tirt = new TIRT();
            tirt.IDComentario = repositorioComentarios.ObtenerId(comentario.Titulo, comentario.Contenido, comentario.Usuario);
            tirt.IDRevisionTecnica= id;
            rt.crearTirt(tirt);

            return Detalles(int.Parse(Request.Form["id"]));
        }

    }
}
